package 网络原理3TCP_IP.简单的网络计算器;

//实现一个网络计算器(Udp版本)
//--
/**
 * 像这样的运算,其实在实际开发中还挺常见的
 * 为啥不自己就算完了,而是非得要交给另外一个服务器来算呢?
 *
 * 运算数据,吃CPU的,如果CPU资源已经很紧张了,此时就可以通过上面的方式,
 * 来引入更多的计算资源
 */

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * 具体开发代码之前,需要先设计设计一下,客户端和服务器之间该如何交换
 * 1.客户端给服务器发的请求是啥样的.
 * 2.服务器给客户端的响应是啥样的.
 * ->回答这两个问题,就是在自定义协议了.
 *
 * 注意!!自定义协议,具体的设计方式,可以有很多很多种类.
 * 一个简单的例子:
 * 请求:字符串.第一个操作数;第二个操作数;运算符
 * 响应:字符串.计算结果
 */
public class CalcServer {
    DatagramSocket socket = null;
    public CalcServer(int port) throws SocketException {
//        服务器启动的时候需要关联一个服务器的端口
        this.socket = new DatagramSocket(port);
    }
    public void start() throws IOException {
        System.out.println("服务器启动!");
        while(true){
            //1.接受请求并解析
            //创建出一个缓冲区
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
            //将请求放进这个缓冲区里
            socket.receive(requestPacket);
            //解析这个请求,构造出字符串,getData()是一个字节类型的
            String request = new String(requestPacket.getData(),0,requestPacket.getLength());

            //根据请求计算响应
            String response = process(request);

            //返回响应,  requestPacket.getSocketAddress()是得到发送请求的一方的地址
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,
                    requestPacket.getSocketAddress());
            socket.send(responsePacket);
            //打印日志
            String log = String.format("[%s:%d] req: %s;resp: %s",requestPacket.getAddress().toString(),
                    requestPacket.getPort(),request,response);
            System.out.println(log);
        }
    }
//    响应:字符串.计算结果 例如:传输过来的是"3;2;+"
    private String process(String request) {
        String[] strs = request.split(";");
        if(strs.length != 3){
            return "[请求格式出错!]";
        }
        int a = Integer.parseInt(strs[0]);
        int b = Integer.parseInt(strs[1]);
        int result = 0;
        if("+".equals(strs[2])){
                result = a + b;
        }else if("-".equals(strs[2])){
                result = a - b;
        }else if("*".equals(strs[2])){
                result = a * b;
        }else if("/".equals(strs[2])){
                result = a / b;
        }else{
            System.out.println("[请求格式错误!没有此运算符]");
            return null;
        }
        return result + "";
    }

    public static void main(String[] args) throws IOException {
        CalcServer server = new CalcServer(9090);
        server.start();
    }
}
